/* =========================================================
   ЕГЭ НАЛЕГКЕ — УРОК В МОБИЛЬНОМ ПРИЛОЖЕНИИ (2.3)

   Где работает: ТОЛЬКО в приложении GetCourse. Там урок — это
   страница /pl/teach/control/lesson/webview, у неё метка
   body.gc-chtm-webview. В браузере файл ничего не делает.

   Что делает:
   1. ШАПКА как в браузере: зелёная карточка, тип урока крупно,
      описание до первого «|», под ним маленькие «назад» /
      «дальше» (штатные ссылки GetCourse на соседние уроки).
      Обе кнопки есть всегда; если идти некуда — серая, неактивная.
   2. ЗАДАНИЕ ВНИЗУ УРОКА, как в браузере. На вкладке «Урок»
      вкладки «урок / задание / ответы» не показываются, а под
      уроком открывается настоящая страница «Задание» во
      встроенном окошке без рамки (её шапка спрятана). Кнопка
      «я посмотрел(а)», ответы, наши скрипты в тексте задания —
      всё работает как на вкладке «Задание», потому что это она
      и есть.
      Если задание не загрузилось (нет сети, сбой GetCourse) —
      вместо него кнопка «открыть задание» (обычная вкладка).
   3. Если вкладку «Задание» открыли напрямую (ссылка из
      уведомления) — она тоже с нашей шапкой и вкладками.

   МЕТКА ВСТРОЕННОГО ОКОШКА: у рамки атрибут data-enl-embed="1".
   Её ставит этот файл сам, в каждом уроке. Скрипты в заданиях
   по ней отличают «видимое задание под уроком» от невидимых
   рамок автоотметки (у тех метки нет).

   Связь с видеоквизом: когда видеоквиз невидимо отметил ТЕКУЩИЙ
   урок, он шлёт событие enl:lesson-marked — окошко с заданием
   перезагружается и показывает «задание принято».

   С 27.10.2026 (2.3) работает во ВСЕХ уроках (ONLY = []).
   Вернуть тест на нескольких уроках — вписать их номера в ONLY.
   ========================================================= */

(function () {

  "use strict";

  var ONLY = [];   /* пусто = все уроки; для теста — номера уроков */
  var EMBED_TIMEOUT = 20000;   /* сколько ждём загрузку задания, мс */

  var CSS = [
    /* --- шапка --- */
    '.enl-apphdr{position:relative;box-sizing:border-box;margin:8px 0 12px;',
    '  padding:20px 16px 16px;background:#D9DC6A;border-radius:20px;',
    '  box-shadow:0 5px 14px rgba(22,22,22,.09);font-family:Raleway,Arial,sans-serif;color:#161616}',
    '.enl-apphdr-label{margin:0;font-size:24px;font-weight:600;line-height:1.05;text-transform:lowercase}',
    '.enl-apphdr-descr{margin:6px 0 0;font-size:13px;line-height:1.35;color:rgba(22,22,22,.75)}',
    '.enl-apphdr-descr:empty{display:none}',
    /* навигация: маленькие аккуратные «таблетки» одинаковой ширины —
       «назад» слева, «дальше» справа; обе есть всегда, если идти
       некуда — серая */
    '.enl-apphdr-go{display:flex;justify-content:space-between;align-items:center;gap:8px;margin:12px 0 0}',
    '.enl-apphdr-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;box-sizing:border-box;width:100px;',
    '  padding:6px 12px;background:#fff;border-radius:999px;color:#161616 !important;',
    '  font-size:12px;font-weight:600;line-height:1.2;text-decoration:none !important;text-transform:lowercase}',
    '.enl-apphdr-btn b{font-weight:400;font-size:13px;line-height:1}',
    '.enl-apphdr-btn--off{background:rgba(255,255,255,.4);color:rgba(22,22,22,.35) !important;pointer-events:none}',
    /* вкладки (только на отдельной вкладке «Задание») */
    'body.gc-chtm-webview .enl-apphdr nav.mode-selector{display:flex;gap:4px;margin:10px 0 0;padding:4px;',
    '  border:0;border-radius:999px;background:rgba(255,255,255,.45)}',
    'body.gc-chtm-webview .enl-apphdr nav.mode-selector a.link{flex:1 1 0;display:block;margin:0;padding:10px 6px;',
    '  border:0;border-radius:999px;background:transparent;color:#161616;',
    '  font-family:Raleway,Arial,sans-serif;font-size:14px;font-weight:600;line-height:1.2;',
    '  text-align:center;text-transform:lowercase;text-decoration:none}',
    'body.gc-chtm-webview .enl-apphdr nav.mode-selector a.link.active{background:#fff;box-shadow:0 2px 6px rgba(22,22,22,.10)}',
    'body.gc-chtm-webview .enl-apphdr nav.mode-selector a.link[data-mode="answers"]{display:none}',
    /* --- задание под уроком --- */
    '.enl-appmis{margin:12px 0 0}',
    '.enl-appmis iframe{display:block;width:100%;height:160px;border:0;background:transparent;overflow:hidden}',
    '.enl-appmis-wait{padding:18px 16px;font-family:Raleway,Arial,sans-serif;font-size:13px;color:rgba(22,22,22,.55);text-align:center}',
    '.enl-appmis-fallback{display:flex;align-items:center;justify-content:center;margin:0 0 16px;min-height:48px;',
    '  background:#D9DC6A;border-radius:999px;color:#161616 !important;font-family:Raleway,Arial,sans-serif;',
    '  font-size:15px;font-weight:600;text-decoration:none !important;text-transform:lowercase}',
    /* --- то же задание ВНУТРИ окошка: прячем всё, кроме самого задания --- */
    'html.enl-embedded body > nav.mode-selector,',
    'html.enl-embedded body > .lesson-title,',
    'html.enl-embedded body > .enl-apphdr,',
    'html.enl-embedded body > .enl-navrow{display:none !important}',
    'html.enl-embedded, html.enl-embedded body{min-height:0 !important;height:auto !important;',
    '  margin:0 !important;padding-top:0 !important;background:transparent !important;overflow:hidden !important}',
    ''
  ].join('\n');

  /* Пока скрипт собирает шапку, старые вкладки и заголовок не
     показываем — чтобы ничего не мигало. Этот кусочек ставится
     сразу, ещё до того, как страница дорисована. */
  var EARLY_CSS =
    'body.gc-chtm-webview:not(.enl-apphdr-ready) > nav.mode-selector,' +
    'body.gc-chtm-webview:not(.enl-apphdr-ready) > .lesson-title{visibility:hidden}';

  function addStyle(id, text) {
    if (document.getElementById(id)) return;
    var st = document.createElement('style');
    st.id = id;
    st.textContent = text;
    (document.head || document.documentElement).appendChild(st);
  }

  function clean(s) { return String(s || '').replace(/\s+/g, ' ').trim(); }

  /* Тип урока — та же логика, что в браузерной шапке (тема «оформление уроков») */
  function typeLabel(src) {
    src = src.toLowerCase();
    if (/вебинар|созвон|трансляц/.test(src)) return 'вебинар';
    if (/домашнее задание/.test(src)) return 'домашнее задание';
    if (/данетк/.test(src)) return 'данетка';
    if (/пробн/.test(src)) return 'пробник';
    if (/тест|тестирован/.test(src)) return 'тест';
    if (/видеоурок|видео-урок|видео урок|смарт-урок/.test(src)) return 'видеоурок';
    return 'урок';
  }

  /* Где мы: обычная страница, наше видимое окошко с заданием
     или невидимая рамка автоотметки. */
  function frameKind() {
    if (window.top === window.self) return 'top';
    try {
      var fe = window.frameElement;
      if (fe && fe.getAttribute('data-enl-embed') === '1') return 'embed';
    } catch (e) {}
    return 'hidden';
  }

  function lessonId() {
    var tab = document.querySelector('nav.mode-selector a[data-lesson-id]');
    return tab ? String(tab.getAttribute('data-lesson-id')) : '';
  }

  function activeMode() {
    var a = document.querySelector('nav.mode-selector a.link.active[data-mode]');
    return a ? a.getAttribute('data-mode') : '';
  }

  /* ---------------- ШАПКА ---------------- */

  function buildHeader(showTabs) {
    var body = document.body;
    if (document.querySelector('.enl-apphdr')) return;
    var nav = document.querySelector('body > nav.mode-selector');
    var lt = document.querySelector('body > .lesson-title');
    if (!nav || !lt) return;

    var h2 = lt.querySelector('h2');
    var title = h2 ? clean(h2.textContent) : '';
    var raw = clean(lt.textContent.replace(h2 ? h2.textContent : '', ''));
    var descr = clean(raw.split('|')[0]);

    /* штатная строка «← Предыдущий урок / Следующий урок →» */
    var prev = null, next = null, navRow = null;
    Array.prototype.forEach.call(document.querySelectorAll('body > div a[href]'), function (a) {
      if (!prev && /Предыдущий урок/.test(a.textContent)) prev = a;
      if (!next && /Следующий урок/.test(a.textContent)) next = a;
    });
    var any = next || prev;
    if (any) navRow = any.parentElement && any.parentElement.parentElement;

    /* a — ссылка GetCourse на соседний урок; нет ссылки — серая неактивная кнопка */
    function btn(a, text, arrowFirst) {
      var b = document.createElement(a ? 'a' : 'span');
      b.className = 'enl-apphdr-btn' + (a ? '' : ' enl-apphdr-btn--off');
      if (a) b.href = a.href;
      else b.setAttribute('aria-disabled', 'true');
      var ar = document.createElement('b');
      ar.textContent = arrowFirst ? '←' : '→';
      var t = document.createTextNode(text);
      if (arrowFirst) { b.appendChild(ar); b.appendChild(t); } else { b.appendChild(t); b.appendChild(ar); }
      return b;
    }

    var card = document.createElement('div');
    card.className = 'enl-apphdr';
    var label = document.createElement('div');
    label.className = 'enl-apphdr-label';
    label.textContent = typeLabel([document.title, title, descr].join(' '));
    card.appendChild(label);
    var d = document.createElement('div');
    d.className = 'enl-apphdr-descr';
    d.textContent = descr;
    card.appendChild(d);

    var go = document.createElement('div');
    go.className = 'enl-apphdr-go';
    go.appendChild(btn(prev, 'назад', true));
    go.appendChild(btn(next, 'дальше', false));
    card.appendChild(go);

    nav.parentNode.insertBefore(card, nav);
    if (showTabs) card.appendChild(nav);
    else nav.style.display = 'none';
    lt.style.display = 'none';
    if (navRow && navRow.parentNode === body) { navRow.style.display = 'none'; navRow.classList.add('enl-navrow'); }
  }

  /* ---------------- ЗАДАНИЕ ПОД УРОКОМ ---------------- */

  function embedMission(id) {
    var tab = document.querySelector('nav.mode-selector a[data-mode="mission"]');
    if (!tab) return;                                   /* у урока нет задания */
    var content = document.querySelector('body > .lesson-content');
    if (!content || document.querySelector('.enl-appmis')) return;

    var box = document.createElement('div');
    box.className = 'enl-appmis';
    var wait = document.createElement('div');
    wait.className = 'enl-appmis-wait';
    wait.textContent = 'загружаем задание…';
    var f = document.createElement('iframe');
    f.setAttribute('data-enl-embed', '1');
    f.setAttribute('scrolling', 'no');
    f.setAttribute('title', 'задание');
    box.appendChild(wait);
    box.appendChild(f);
    content.parentNode.insertBefore(box, content.nextSibling);

    var done = false;
    function fallback() {
      if (done) return;
      done = true;
      box.innerHTML = '';
      var a = document.createElement('a');
      a.className = 'enl-appmis-fallback';
      a.href = tab.href;
      a.textContent = 'открыть задание →';
      box.appendChild(a);
    }
    var timer = setTimeout(fallback, EMBED_TIMEOUT);

    var firstLoad = true;
    f.addEventListener('load', function () {
      /* проверяем только первую загрузку; дальше окошко перезагружается
         само (ученик нажал кнопку) — это нормально */
      if (!firstLoad || !f.parentNode) return;
      firstLoad = false;
      var doc = null;
      try { doc = f.contentDocument; } catch (e) {}
      if (!doc || !doc.body) { clearTimeout(timer); fallback(); return; }
      if (!doc.querySelector('.lt-lesson-mission-block, #lessonAnswerForm, .lesson-mission-wrapper')) {
        /* страница открылась, но задания в ней нет (или ошибка GetCourse) */
        clearTimeout(timer); fallback(); return;
      }
      clearTimeout(timer);
      done = true;
      if (wait.parentNode) wait.parentNode.removeChild(wait);
      /* высоту окошко подстраивает само изнутри — см. runEmbedded() */
    });

    f.src = tab.href;

    /* видеоквиз отметил этот урок невидимо — показываем «задание принято» */
    window.addEventListener('enl:lesson-marked', function (e) {
      var mid = e && e.detail ? String(e.detail.id) : '';
      if (mid === id && f.parentNode) {
        try { f.contentWindow.location.reload(); } catch (err) { f.src = tab.href; }
      }
    });
  }

  /* Код, который работает ВНУТРИ окошка с заданием. */
  function runEmbedded() {
    document.documentElement.classList.add('enl-embedded');
    var fe = window.frameElement;

    /* штатная строка «← Предыдущий урок / Следующий урок →» внутри
       окошка не нужна — навигация уже есть в шапке урока */
    Array.prototype.forEach.call(document.querySelectorAll('body > div a[href]'), function (a) {
      if (!/Предыдущий урок|Следующий урок/.test(a.textContent)) return;
      var row = a.parentElement && a.parentElement.parentElement;
      if (row && row.parentNode === document.body) row.classList.add('enl-navrow');
    });

    function contentHeight() {
      var max = 0;
      Array.prototype.forEach.call(document.body.children, function (el) {
        if (el.offsetParent === null && getComputedStyle(el).position !== 'fixed') return;
        var r = el.getBoundingClientRect();
        var bottom = r.bottom + (window.pageYOffset || 0);
        if (bottom > max) max = bottom;
      });
      return Math.ceil(max) + 12;
    }
    var last = 0;
    function fit() {
      var h = contentHeight();
      if (h > 20 && Math.abs(h - last) > 2) { last = h; fe.style.height = h + 'px'; }
    }
    fit();
    if (window.ResizeObserver) new ResizeObserver(fit).observe(document.body);
    new MutationObserver(fit).observe(document.body, { childList: true, subtree: true, attributes: true });
    window.addEventListener('load', fit);
    var n = 0, t = setInterval(function () { fit(); if (++n > 20) clearInterval(t); }, 500);

    /* Ссылки из задания (профили, внешние материалы) открываем в
       самом приложении, а не внутри окошка. Кнопки и формы задания
       не трогаем — они остаются внутри. */
    document.addEventListener('click', function (e) {
      var a = e.target && e.target.closest ? e.target.closest('a[href]') : null;
      if (!a || e.defaultPrevented) return;
      var href = a.getAttribute('href') || '';
      if (!href || href.charAt(0) === '#' || /^javascript:/i.test(href)) return;
      if (a.target && a.target !== '_self') return;
      e.preventDefault();
      window.top.location.href = a.href;
    });
  }

  /* ---------------- ЗАПУСК ---------------- */

  function start() {
    var body = document.body;
    if (!body || !body.classList.contains('gc-chtm-webview')) return;
    var kind = frameKind();
    if (kind === 'hidden') return;                      /* рамки автоотметки не трогаем */

    var id = lessonId();
    if (ONLY.length && ONLY.indexOf(id) === -1) return;

    addStyle('enl-apphdr-css', CSS);

    if (kind === 'embed') { runEmbedded(); return; }

    var mode = activeMode();
    try {
      if (mode === 'content') {
        buildHeader(false);
        embedMission(id);
      } else {
        buildHeader(true);
      }
    } finally {
      body.classList.add('enl-apphdr-ready');
    }
  }

  /* Ранний кусочек стиля — только на «верхней» странице приложения
     из списка (номер урока ещё неизвестен, поэтому проверяем список
     после загрузки и снимаем, если урок не наш). */
  if (frameKind() === 'top') addStyle('enl-apphdr-early', EARLY_CSS);

  function boot() {
    start();
    var b = document.body;
    if (b) b.classList.add('enl-apphdr-ready');         /* старая шапка не прячется навсегда ни при каком исходе */
  }
  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);
  else boot();

})();
